/**
 * Notes: 用户实体
 * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux0730 (wechat)
 * Date: 2020-10-14 19:20:00 
 */

const BaseProjectModel = require('./base_project_model.js');

class UserModel extends BaseProjectModel {

	static STATUS = {
		UNUSE: 0,
		COMM: 1,
		UNCHECK: 8,
		DEL: 9
	}

	/**
	 * 获取所有用户列表
	 */
	static async getAll(where, fields) {
		return await this.getAllBig(where, fields);
	}
	
	/**
	 * 根据openid获取用户信息
	 * @param {string} openId 
	 * @param {array} fields 返回字段
	 */
	static async getByOpenId(openId, fields = '*') {
		return await this.getOne({ USER_MINI_OPENID: openId }, fields);
	}
	
	/**
	 * 根据企业微信ID获取用户信息
	 * @param {string} wxworkId 
	 * @param {array} fields 返回字段
	 */
	static async getUserByWxworkId(wxworkId, fields = '*') {
		return await this.getOne({ USER_WXWORK_ID: wxworkId }, fields);
	}
	
	/**
	 * 更新用户最近登录时间
	 * @param {string} userId 
	 */
	static async updateLoginTime(userId) {
		return await this.edit({
			USER_ID: userId
		}, {
			USER_LOGIN_TIME: this._timestamp,
			USER_LOGIN_CNT: this.db.command.inc(1)
		});
	}
	
	/**
	 * 检查用户是否拥有指定角色
	 * @param {string} userId 用户ID 
	 * @param {string} role 角色代码
	 */
	static async checkUserRole(userId, role) {
		let user = await this.getOne({ USER_ID: userId });
		if (!user) return false;
		
		let roles = user.USER_ROLES || [];
		return roles.includes(role) || roles.includes('admin');
	}
	
	/**
	 * 安全插入用户数据，确保符合数据库结构定义
	 * @param {object} data 用户数据
	 */
	static async safeInsert(data) {
		// 导入util模块获取项目ID
		const util = require('../../../framework/helpers/util.js');
		const dataUtil = require('../../../framework/helpers/data_util.js');
		
		// 检查并修正数据类型，确保符合DB_STRUCTURE定义
		const sanitizedData = {};
		
		// 根据DB_STRUCTURE定义的字段和类型进行检查
		for (const field in this.DB_STRUCTURE) {
			if (field === '_pid' || field === 'USER_ID') continue; // 跳过ID字段，后面特殊处理
			
			const fieldDef = this.DB_STRUCTURE[field];
			const fieldType = fieldDef.split('|')[0];
			
			// 如果数据中有该字段
			if (data.hasOwnProperty(field)) {
				let value = data[field];
				
				// 根据字段类型进行转换
				if (fieldType === 'string') {
					sanitizedData[field] = String(value || '');
				} else if (fieldType === 'int') {
					sanitizedData[field] = parseInt(value || 0);
				} else if (fieldType === 'array') {
					sanitizedData[field] = Array.isArray(value) ? value : [];
				} else if (fieldType === 'object') {
					sanitizedData[field] = (value && typeof value === 'object') ? value : {};
				} else {
					sanitizedData[field] = value;
				}
			}
		}
		
		// 恢复表单数据处理
		if (data.USER_FORMS && Array.isArray(data.USER_FORMS)) {
			sanitizedData.USER_FORMS = data.USER_FORMS;
			
			// 恢复USER_OBJ处理，但使用安全方式
			try {
				sanitizedData.USER_OBJ = dataUtil.dbForms2Obj(data.USER_FORMS);
				console.log('[safeInsert] 表单转对象成功');
			} catch (e) {
				console.warn('[safeInsert] 表单转对象失败，使用简化对象:', e);
				sanitizedData.USER_OBJ = {
					name: data.USER_NAME || '',
					mobile: data.USER_MOBILE || '',
					dept: data.USER_DEPT || ''
				};
				
				// 尝试从表单中提取更多字段
				if (Array.isArray(data.USER_FORMS)) {
					data.USER_FORMS.forEach(item => {
						if (item && item.mark && item.val !== undefined) {
							sanitizedData.USER_OBJ[item.mark] = item.val;
							// 添加一些常用字段的别名
							if (item.mark === 'zhiwu') sanitizedData.USER_OBJ.title = item.val;
							if (item.mark === 'no') sanitizedData.USER_OBJ.userNo = item.val;
						}
					});
				}
			}
		}
		
		// 生成USER_ID字段 (如果不存在)
		if (!data.USER_ID) {
			sanitizedData.USER_ID = dataUtil.makeID(); // 使用dataUtil的ID生成方法
		} else {
			sanitizedData.USER_ID = data.USER_ID;
		}
		
		// 设置项目ID
		sanitizedData._pid = util.getProjectId();
		
		console.log('[safeInsert] 清洗后的数据:', sanitizedData);
		
		try {
			// 插入数据
			return await this.insert(sanitizedData);
		} catch (e) {
			console.error('[safeInsert] 插入失败:', e);
			throw new Error('插入用户数据失败: ' + e.message);
		}
	}

}

// 集合名
UserModel.CL = BaseProjectModel.C('oa_user');

UserModel.DB_STRUCTURE = {
	_pid: 'string|true',
	USER_ID: 'string|true',

	USER_MINI_OPENID: 'string|true|comment=小程序openid',
	USER_STATUS: 'int|true|default=1|comment=状态 0=待审核,1=正常,8=审核未过,9=禁用',
	USER_CHECK_REASON: 'string|false|comment=审核未过的理由',

	USER_NAME: 'string|false|comment=姓名',
	USER_MOBILE: 'string|false|comment=联系电话',
	USER_PASSWORD: 'string|false|comment=密码',
	
	USER_PIC: 'string|false|comment=头像',

	USER_DEPT: 'string|false|comment=部门',
	USER_DEPT_ID: 'string|false|comment=部门ID',
	USER_TITLE: 'string|false|comment=职位',
	USER_AUTH: 'int|true|default=0|comment=是否有审批权限 0/1',
	
	USER_WXWORK_ID: 'string|false|comment=企业微信ID',
	USER_WXWORK_CORPID: 'string|false|comment=企业微信企业ID',
	
	USER_ROLES: 'array|true|default=[]|comment=用户角色数组',
	USER_TYPE: 'int|true|default=0|comment=用户类型 0=普通用户,1=管理员',

	USER_FORMS: 'array|true|default=[]',
	USER_OBJ: 'object|true|default={}',

	USER_LOGIN_CNT: 'int|true|default=0|comment=登陆次数',
	USER_LOGIN_TIME: 'int|false|comment=最近登录时间',

	USER_ADD_TIME: 'int|true',
	USER_ADD_IP: 'string|false',

	USER_EDIT_TIME: 'int|true',
	USER_EDIT_IP: 'string|false',
}

// 字段前缀
UserModel.FIELD_PREFIX = "USER_";

/**
 * 状态 0=待审核,1=正常,2=审核未过,9=禁用
 */
UserModel.STATUS_DESC = {
	UNUSE: '待审核',
	COMM: '正常',
	UNCHECK: '未通过审核',
	FORBID: '禁用'
};

module.exports = UserModel;